from openai import OpenAI
import json

client = OpenAI(api_key="sk-AnCylv8Koz51m0IKZc4bPRxzR8P9EFgnUHymNWHBXQCZa5Hx", base_url="https://api.kkyyxx.xyz/v1")

def extract_main_content(text: str) -> str:
    prompt = (f"""
你是一位专业学术助手，专注于论文摘要撰写。  
请根据以下论文正文，生成一段高质量摘要，要求：
1. 语言简洁、正式、学术化
2. 概括论文的研究目的、方法、主要发现和结论
3. 不要逐句复制正文
4. 中文输出，长度约为400-500字

论文正文：
{text}
""")

    completion = client.chat.completions.create(
        model="claude-3-5-sonnet",
        messages=[
            {"role": "system", "content": "你是一个学术论文内容提取助手。"},
            {"role": "user", "content": prompt}
        ],
        temperature=0.3
    )
    return completion.choices[0].message.content
def score_paper_title(title: str) -> dict:
    prompt = (
        f"请根据以下两个评分要素对论文题目打分："
        f"1、价值导向：要求是体现立德树人要求，符合党和国家方针政策和法律法规，符合社会主义核心价值观，顺应国内外科技发展趋势和创新精神。"
        f"2、选题目的与意义：要求是符合专业培养目标，体现综合训练基本要求；面向所在专业领域学术问题或行业社会实际问题，有一定的理论或实用价值。\n"
        f"论文题目：{title}\n"
        f"输出格式为 JSON，包含 score1（0-100）、score2（0-100）和 suggest1（价值导向修改建议）、suggest2（选题目的与意义修改建议）。"
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score1 = float(result.get("score1", 0))
            score2 = float(result.get("score2", 0))
            suggest1 = result.get("suggest1", "")
            suggest2 = result.get("suggest2", "")
        except json.JSONDecodeError:
            score1 = None
            score2 = None
            suggest1 = text
            suggest2 = text
        return {"价值导向": score1, "选题目的与意义": score2, "suggest1": suggest1, "suggest2": suggest2}

    except Exception as e:
        print("评分失败:", e)
        return {"价值导向": None, "选题目的与意义": None, "suggest1": str(e), "suggest2": str(e)}
def score_workload(word_count1:int, word_count2:int, chapter_count1:int, chapter_count2:int, ref_count1:int, ref_count2:int) ->dict:
    prompt = (
        f"论文总字数：{word_count1}，模板要求总字数：{word_count2}，论文章节数：{chapter_count1}，模板要求章节数：{chapter_count2}，论文参考文献数：{ref_count1}，模板要求参考文献数：{ref_count2}\n"
        f"以上是关于论文的一些参数，请帮我根据这些参数，对比论文参数与模版要求参数，根据这些参数判断论文是否符合以下评议要素："
        f"工作量饱满，能反映出学生的综合能力培养过程。"
        f"为论文的工作量打出分数（0-100），并给出修改建议\n"
        f"输出格式只包括一个JSON，包含 score（0-100）和suggest（工作量修改建议）。"
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score = float(result.get("score", 0))
            suggest = result.get("suggest", "")
        except json.JSONDecodeError:
            score = None
            suggest = text
        return {"工作量": score, "suggest": suggest}

    except Exception as e:
        print("评分失败:", e)
        return {"工作量": None, "suggest": str(e)}
def score_refSurvey(five_year1:float, five_year2:float, three_year1:float, three_year2:float, english_count1:int, english_count2:int) ->dict:
    prompt = (
        f"论文引用近五年参考文献占比：{five_year1}，模板要求引用近五年参考文献占比：{five_year2}，论文引用近三年参考文献占比：{three_year1}，模板要求引用近三年参考文献占比：{three_year2}，论文英文文献数量：{english_count1}，模板要求英文文献数量：{english_count2}\n"
        f"以上是关于论文的一些参数，请帮我根据这些参数，对比论文参数与模版要求参数，根据这些参数判断论文是否符合以下评议要素："
        f"综合分析国内外文献，追踪本领域研究现状或行业动态，关注学科及本领域前沿，能支撑该论文(设计)的选题。"
        f"为论文的文献调研能力打出分数（0-100），并给出修改建议\n"
        f"输出格式只包括一个JSON，包含 score（0-100）和suggest（文献调研能力修改建议）。"
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score = float(result.get("score", 0))
            suggest = result.get("suggest", "")
        except json.JSONDecodeError:
            score = None
            suggest = text
        return {"文献调研能力": score, "suggest": suggest}

    except Exception as e:
        print("评分失败:", e)
        return {"文献调研能力": None, "suggest": str(e)}
def score_contentOrganization(paper_chapter: list[str], template_chapter: list[str]) -> dict:
    prompt = (
        f"论文所包含的章节名：{paper_chapter}，模板要求所包含的章节名：{template_chapter}\n"
        f"以上是论文和模板的章节名，将论文和模板的章节名进行语义相似度分析，根据匹配结果和评议要素为论文的内容组织能力打出分数（0-100），并给出修改建议\n"
        f"以下是内容组织指标的评议要素：核心模块完备，层次分明，重点突出，详略得当。"
        f"输出格式只包括一个JSON，包含 score（0-100）和suggest（内容组织能力修改建议）。"
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score = float(result.get("score", 0))
            suggest = result.get("suggest", "")
        except json.JSONDecodeError:
            score = None
            suggest = text
        return {"内容组织能力": score, "suggest": suggest}

    except Exception as e:
        print("评分失败:", e)
        return {"内容组织能力": None, "suggest": str(e)}
def score_logicStructure(title: str, abstract: str, keywords:str, content:str) -> dict:
    prompt = (
        f"论文题目：{title}，论文摘要：{abstract}，论文关键词：{keywords}，论文正文抽取出的主要内容：{content}\n"
        f"以上是由上传的论文拆分抽取后得到的论文题目、论文摘要、论文关键词、论文正文抽取出的主要内容，根据这些内容判断学生论文是否符合以下评议要素："
        f"研究（设计）路径合理，论点鲜明，论据确凿，论证充分，达到所在专业领域要求"
        f"根据评议要素为论文的逻辑结构打出分数（0-100），并给出修改建议\n"
        f"输出格式只包括一个JSON，包含 score（0-100）和suggest（逻辑结构修改建议）。"
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score = float(result.get("score", 0))
            suggest = result.get("suggest", "")
        except json.JSONDecodeError:
            score = None
            suggest = text
        return {"逻辑结构": score, "suggest": suggest}
    except Exception as e:
        print("评分失败:", e)
        return {"逻辑结构": None, "suggest": str(e)}
def score_others(text:str) -> dict:
    prompt = (
        f"""
        设定如下指标及评议要素：
        指标：写作形式；评议要素：写作形式符合专业特点和选题需要。
        指标：综合应用知识能力；评议要素：将相关领域的基础理论、专业知识合理应用到研究（设计）工作中， 能体现所在专业领域的能力和素养。
        指标：分析解决问题能力；评议要素：运用专业知识，采取恰当的研究（设计）方法、路径开展研究（设计），善于发现问题、分析问题，具备解决实际问题的能力和素养。
        指标：创新能力；评议要素：观点新颖，体现出较强的创新意识，或对实践具有一定指导意义。
        指标：行为规范；评议要素：文字表达、书写格式、图表(图纸)、公式符号、缩略 词等方面符合通行学术规范。
        指标：引用规范；评议要素：在资料引证、参考文献等方面符合通行学术规范和知识 产权相关规定。
        根据评议要素为论文的各个指标打出分数（0-100），并给出评分的依据，让老师可以根据评分依据自行修改分数
        论文正文：{text}
        【输出格式要求】
        你必须返回一个严格的JSON对象，且只包含以下12个字段，不要添加任何其他字段：
        {{
        "score1":[此处填写写作形式分数, 0-100的整数],
        "suggest1": "[此处填写写作形式的评分依据和建议]",
        "score2":[此处填写综合应用知识能力分数, 0-100的整数],
        "suggest2": "[此处填写综合应用知识能力的评分依据和建议]",
        "score3":[此处填写分析解决问题能力分数, 0-100的整数],
        "suggest3": "[此处填写分析解决问题能力的评分依据和建议]",
        "score4":[此处填写创新能力分数, 0-100的整数],
        "suggest4": "[此处填写创新能力的评分依据和建议]",
        "score5":[此处填写行文规范分数, 0-100的整数],
        "suggest5": "[此处填写行文规范的评分依据和建议]",
        "score6":[此处填写引用规范分数, 0-100的整数],
        "suggest6": "[此处填写引用规范的评分依据和建议]"
        }}
        【重要指令】
        1. 分数必须是0-100之间的整数
        2. 评分依据要具体、有针对性，基于论文实际内容
        3. 不要返回任何其他文字，只返回JSON对象
        4. 确保JSON格式完全正确，能够被json.loads()直接解析"""
    )
    try:
        response = client.chat.completions.create(
            model="claude-3-5-sonnet",
            messages=[
                {"role": "system", "content": "你是一个论文评分助手。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0
        )
        text = response.choices[0].message.content
        try:
            result = json.loads(text)
            score1 = float(result.get("score1", 0)) if result.get("score1") is not None else None
            suggest1 = result.get("suggest1", "")
            score2 = float(result.get("score2", 0)) if result.get("score2") is not None else None
            suggest2 = result.get("suggest2", "")
            score3 = float(result.get("score3", 0)) if result.get("score3") is not None else None
            suggest3 = result.get("suggest3", "")
            score4 = float(result.get("score4", 0)) if result.get("score4") is not None else None
            suggest4 = result.get("suggest4", "")
            score5 = float(result.get("score5", 0)) if result.get("score5") is not None else None
            suggest5 = result.get("suggest5", "")
            score6 = float(result.get("score6", 0)) if result.get("score6") is not None else None
            suggest6 = result.get("suggest6", "")

        except json.JSONDecodeError:
            score1 = score2 = score3 = score4 = score5 = score6 = None
            suggest1 = suggest2 = suggest3 = suggest4 = suggest5 = suggest6 = "AI返回格式错误，无法解析评分结果"
        return {"写作形式": score1, "写作形式依据": suggest1,
                "综合应用知识能力":score2, "综合应用知识能力依据": suggest2,
                "分析解决问题能力":score3, "分析解决问题能力依据": suggest3,
                "创新能力":score4, "创新能力依据": suggest4,
                "行文规范":score5, "行文规范依据": suggest5,
                "引用规范":score6, "引用规范依据": suggest6}
    except Exception as e:
        print("评分失败:", e)
        return {
            "写作形式": None,
            "写作形式依据": f"评分系统错误: {str(e)}",
            "综合应用知识能力": None,
            "综合应用知识能力依据": f"评分系统错误: {str(e)}",
            "分析解决问题能力": None,
            "分析解决问题能力依据": f"评分系统错误: {str(e)}",
            "创新能力": None,
            "创新能力依据": f"评分系统错误: {str(e)}",
            "行文规范": None,
            "行文规范依据": f"评分系统错误: {str(e)}",
            "引用规范": None,
            "引用规范依据": f"评分系统错误: {str(e)}"
        }